iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
自我挑戰組

Spring Boot 三十天挑戰賽系列 第 12

Day 12 - Spring Data JPA - 從基礎到實作

  • 分享至 

  • xImage
  •  

跟 SQL say goodbye 好適合聽 James Bay 的新歌 Goodbye Never Felt So Bad
強推 James 所有歌曲的 live/acoustic 版本,絕對是聽覺上的享受!
Yes

什麼是 JPA?

  • Java Persistence API (JPA) 是 Java 平台上的一套 ORM 標準規範。

  • 一般來說,談及資料庫會想到 SQL 和 table,但在 Java 開發情境下更常以物件的角度思考。JPA 就是提供一個橋樑,將這兩個世界(資料表 ↔︎ 物件)連接起來。

  • ORM 允許我們使用物件導向的方式來操作資料庫,讓我們不必直接與 SQL 互動,而是改由操作 Java 物件更直觀地進行資料存取。這意味著我們可以用 Java class 來代表資料庫 table,並用類別的屬性來代表資料表的欄位

  • 這是一個基本的 JPA entity,代表一個 User,該 entity 會 mapping 到 table name 為 user 的表。

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    public class User {
    
        @Id
        @GeneratedValue
        private Long id;
    
        private String name;
        private String email;
    
        // 省略 getters, setters 還有其他方法
    }
    
    
  • 使用 ORM 可以提高開發效率,不需再寫大量的 SQL 程式碼。但沒有絕對完美的解方,相對它也有一些缺點:

    1. 效能問題
      • ORM 複雜的查詢時效能可能不如手刻 SQL。
      • 過度的 lazy-loading 或是 Eager 都可能導致效能問題。
    2. 複雜度
      • 對於簡單的資料庫操作,使用 ORM 可能讓結構變得過度複雜。
      • 要能最佳化使用 ORM 需要深入了解他的運作原理(白話文:易學難精),否則可能會遇到很多意外(白話文:坑踩好踩滿)。
        https://ithelp.ithome.com.tw/upload/images/20230927/20162682KRPQxwo3Aw.jpg
    3. 不適用於所有情境
      • 對於某些特定的操作或查詢,直接使用 SQL 可能更有意義。
      • 跨資料庫的操作或非常規的資料存取模式可能不適合使用 ORM。
    • 以上就是一些 ORM 和 JPA 的缺點,在開發中如能正確使用 ORM 和 JPA 可以大大提高開發效率,減少冗長的程式碼,任何工具或技術都需要了解它的優缺點再進行評估是否使用。

Spring Boot 與 JPA 的整合

Spring Boot 提供了一系列的 starters,其中包含專為 JPA 設計的 spring-boot-starter-data-jpa

整合的好處如下:

  1. 簡化設定:只要幾行設定,就可以定義資料庫連接、選擇 JPA 提供者(ex: Hibernate)等。

    1. pom.xml / build.gradle 中加入 dependency:

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
      <dependency>
          <groupId>org.h2</groupId>
          <artifactId>h2</artifactId> // 這邊用 h2 in memory database
          <scope>runtime</scope>
      </dependency>
      
    2. 設定資料庫連線:在 application.properties 中,設定資料庫連線資訊:

      spring.datasource.url=jdbc:h2:mem:testdb
      spring.datasource.driver-class-name=org.h2.Driver
      spring.datasource.username= dbmeowmeow
      spring.datasource.password= pwmeowmeow
      spring.jpa.hibernate.ddl-auto=update
      
  2. Repository:Spring Data JPA 提供了 Repository,讓 CRUD 操作變簡單。以下為 interface 繼承關係:

    Repository
      ↘
    CrudRepository -> 提供基本的 CRUD 功能
      ↘
    PagingAndSortingRepository -> 提供分頁和排序功能
      ↘
    JpaRepository -> 提供 flush()、batch 操作等
    
    import org.springframework.data.repository.CrudRepository;
    
    public interface UserRepository extends JpaRepository<User, Long> {
    }
    
    
  3. 優化查詢:可以使用方法名自動產生查詢,或者使用 @Query 注解自定義。

  4. 交易管理:Spring Boot 簡化了交易管理的流程,只需要使用 @Transactional 註解即可

  5. 異常處理:Spring Data JPA 將資料庫相關的異常轉化為 Spring 專用的異常,使異常處理更加一致。


上一篇
Day 11 - Handle those Exceptions - SpringBoot 中的例外處理
下一篇
Day 13 - Hibernate - Java Persistence
系列文
Spring Boot 三十天挑戰賽30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言